home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / archiver / ziptv21.zip / INTRCOMM.INT < prev    next >
Text File  |  1990-04-22  |  7KB  |  195 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. const
  14.    carrier_lost = #$E3;              (* code returned with carrier is lost *)
  15.  
  16.    com_chan:     integer = 0;   (* current communication channel, 0=none *)
  17.  
  18.    port_base:    integer = -1;  (* base port number for 8250 chip *)
  19.                                 (* value = -1 until init is finished *)
  20.  
  21.    port_irq:     integer = -1;  (* port irq number *)
  22.  
  23.    old_vector:   pointer = nil; (* pointer to original com interrupt handler *)
  24.    
  25.    XOFF_char:    char = ^S;     (* XOFF character code *)
  26.  
  27.    disable_cts_check: boolean = false; {false if RTS handshake is needed}
  28.  
  29.    even_parity:   boolean = false; {strip parity?}
  30.  
  31.  
  32. var
  33.    port_intr:    integer;       (* interrupt number for 8250 chip *)
  34.    intr_mask:    integer;       (* interrupt controller initialization code *)
  35.  
  36.    uart_type:    byte;          (* contents of UART identification register *)
  37.    prev_LCR:     byte;          (* previous LCR contents *)
  38.    prev_IER:     byte;          (* previous IER contents *)
  39.    prev_MCR:     byte;          (* previous MCR contents *)
  40.    prev_ICTL:    byte;          (* previous ICTL contents *)
  41.  
  42.    xmit_active:  boolean;       (* is the transmitter active now?
  43.                                    (is a THRE interrupt expected?) *)
  44.  
  45.    XOFF_active:  boolean;       (* has XOFF suspended transmit? *)
  46.  
  47.    rxque:        queue_rec;     (* receive data queue *)
  48.    txque:        queue_rec;     (* transmit data queue *)
  49.  
  50.    reg:          registers;     (* register package *)
  51.  
  52. (**
  53.    bios_bastab:  array[0..3] of word absolute $40:0;
  54. **)
  55.                                 (* bios table of com port bases for each
  56.                                    port com1..com4 *)
  57.  
  58.  
  59. (*
  60.  * Uart register definitions
  61.  *
  62.  *)
  63.  
  64. const
  65.    ICTL = $21;                  (* system interrupt controller i/o port *)
  66.  
  67.    RBR = 0;  (* receive buffer register *)
  68.    THR = 0;  (* transmit holding register *)
  69.  
  70.    DLM = 1;  (* divisor latch MSB *)
  71.    IER = 1;  (* interrupt enable register *)
  72.       IER_DAV     = $01;       (* data available interrupt *)
  73.       IER_THRE    = $02;       (* THR empty interrupt *)
  74.       IER_LSRC    = $04;       (* line status change interrupt *)
  75.       IER_MSR     = $08;       (* modem status interrupt *)
  76.  
  77.  
  78.    IIR = 2;  (* interrupt identification register *)
  79.       IIR_PENDING = $01;       (* low when interrupt pending *)
  80.  
  81.       IIR_MASK    = $06;       (* mask for interrupt identification *)
  82.         IIR_MSR     = $00;       (* modem status change interrupt *)
  83.         IIR_THRE    = $02;       (* transmit holding reg empty interrupt *)
  84.         IIR_DAV     = $04;       (* data available interrupt *)
  85.         IIR_LSR     = $06;       (* line status change interrupt *)
  86.  
  87.    FCR = 2;  (* FIFO control register *)
  88.       FCR_ENABLE_FIFO   = $C1;   (* write to port to enable FIFO *)
  89.       FCR_DISABLE_FIFO  = $00;   (* write to port to disable FIFO *)
  90.       FCR_16550         = $80;   (* bit set if chip is 16550 or 16550AN *)
  91.  
  92.    LCR = 3;  (* line control register *)
  93.       LCR_5BITS   = $00;       (* 5 data bits *)
  94.       LCR_7BITS   = $02;       (* 7 data bits *)
  95.       LCR_8BITS   = $03;       (* 8 data bits *)
  96.  
  97.       LCR_1STOP   = $00;       (* 1 stop bit *)
  98.       LCR_2STOP   = $04;       (* 2 stop bits *)
  99.  
  100.       LCR_NPARITY = $00;       (* no parity *)
  101.       LCR_EPARITY = $38;       (* even parity *)
  102.  
  103.       LCR_NOBREAK = $00;       (* break disabled *)
  104.       LCR_BREAK   = $40;       (* break enabled *)
  105.  
  106.      {LCR_NORMAL  = $00;}      (* normal *)
  107.       LCR_ABDL    = $80;       (* address baud divisor latch *)
  108.  
  109.  
  110.    MCR = 4;  (* modem control register *)
  111.       MCR_DTR     = $01;       (* active DTR *)
  112.       MCR_RTS     = $02;       (* active RTS *)
  113.       MCR_OUT1    = $04;       (* enable OUT1 *)
  114.       MCR_OUT2    = $08;       (* enable OUT2 -- COM INTERRUPT ENABLE *)
  115.       MCR_LOOP    = $10;       (* loopback mode *)
  116.  
  117.  
  118.    LSR = 5;  (* line status register *)
  119.      LSR_DAV      = $01;       (* data available *)
  120.      LSR_OERR     = $02;       (* overrun error *)
  121.      LSR_PERR     = $04;       (* parity error *)
  122.      LSR_FERR     = $08;       (* framing error *)
  123.      LSR_BREAK    = $10;       (* break received *)
  124.      LSR_THRE     = $20;       (* THR empty *)
  125.      LSR_TSRE     = $40;       (* transmit shift register empty *)
  126.  
  127.      LOERR_count:       integer = 0;    {overrun error count}
  128.      LPERR_count:       integer = 0;    {parity error count}
  129.      LFERR_count:       integer = 0;    {framing error count}
  130.      LBREAK_count:      integer = 0;    {break received count}
  131.  
  132.  
  133.    MSR = 6;  (* modem status register *)
  134.      MSR_DCTS     = $01;       (* delta CTS *)
  135.      MSR_DDSR     = $02;       (* delta DSR *)
  136.      MSR_DRING    = $04;       (* delta ring *)
  137.      MSR_DRLSD    = $08;       (* delta receive line signal detect *)
  138.      MSR_CTS      = $10;       (* clear to send *)
  139.      MSR_DSR      = $20;       (* data set ready *)
  140.      MSR_RING     = $40;       (* ring detect *)
  141.      MSR_RLSD     = $80;       (* receive line signal detect *)
  142.  
  143.  
  144. (* table of port base and interrupt vector for each COMn: value *)
  145.    LOCAL_COMn = 0;
  146.    MAX_COMn = 8;
  147.    COM_BASE_TABLE: ARRAY[1..MAX_COMn] OF WORD =
  148.         ($3F8,$2F8,$3E8,$2E8,0,0,$2E8,$3E8);
  149.    COM_IRQ_TABLE:  ARRAY[1..MAX_COMn] OF BYTE =
  150.         (4, 3, 4, 3, 0, 0, 5, 5);
  151.  
  152.  
  153. (* table of interrupt masks an interrupt vectors for each IRQ number *)
  154.    IRQ_MASK_TABLE: ARRAY[0..7] OF BYTE =
  155.         ($01,$02,$04,$08,$10,$20,$40,$80);
  156.    IRQ_VECT_TABLE: ARRAY[0..7] OF BYTE =
  157.         ($08,$09,$0A,$0B,$0C,$0D,$0E,$0F);
  158.  
  159.  
  160. procedure push_flags;
  161.    inline($9C);
  162.  
  163. procedure pop_flags;
  164.    inline($9D);
  165.  
  166. procedure disable_int;
  167.    inline($FA);
  168.  
  169. procedure enable_int;
  170.    inline($FB);
  171.  
  172. procedure io_delay;
  173.    inline($EB/$00);     {jmp $+2}
  174.  
  175. procedure INTR_service_transmit;
  176. procedure INTR_poll_transmit;
  177. procedure INTR_service_receive;
  178. procedure INTR_check_interrupts;
  179.  
  180. procedure cancel_xoff;
  181. procedure control_k;
  182. procedure INTR_lower_dtr;
  183. procedure INTR_raise_dtr;
  184. procedure INTR_select_port;
  185. procedure INTR_init_com;
  186. procedure INTR_uninit_com;
  187. procedure INTR_set_baud_rate(speed: word);
  188.  
  189. procedure INTR_flush_com;
  190. procedure INTR_transmit_data(s:    longstring);
  191. function  INTR_receive_ready: boolean;
  192. function  INTR_receive_data:  char;
  193. procedure verify_txque_space;
  194.  
  195.